# Синхронизация файлов с перезаписью секретных критичных данных

### Применение

Программное обеспечение иногда требует использования секретных паролей, ключей, токенов и прочих данных которые нельзя публиковать, но нужно использовать в процессе разработки и следить затем чтобы они не попали в общий доступ или в git commit.

Для этого можно использовать дублирующие sample файлы в которых секретные данные скрыты в таком формате:
```ini
SECRET_KEY = <your secret key>
```
Рабочие файлы, которые компилируются и запускаются в проекте при тестировании, добавить `.gitignore`

Для того чтобы каждый раз не менять содержимое файлов вручную здесь реализованы скрипты синхронизации которые автоматически срабатывают при сохранении.

Многие редакторы кода имеют возможность запуска сторонних программ при сохранении файла. Например расширение [RunOnSave](https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave) для Visual Studio Code запускает системные команды при сохранении файла.

Скрипты: `synchro.py` или `synchro.php` идентичны. Выполняют синхронизацию с перезаписью секретных данных. 

Параметры запуска:

```shell
php synchro.php work_config_file sample_suffix
python3 synchro.py work_config_file sample_suffix
```
Аргументы:
 - `work_config_file` - путь к файлу в котором хранятся секретные данные
 - `sample_suffix` - строка, которая будет добавлена перед расширением имени файла при синхронизации. 
 
 Например: если рабочий файл называется `config.json`, а `sample_suffix = .sample`, то будет создана безопасная копия рабочего файла с именем `config.sample.json`

Инструкции перезаписи секретных данных хранятся в файле `synchro.json`. В нем указываются все файлы и параметры перезаписи. 

```json
{
    "REAL_secret_pass": "SAMPLE_SECRET_PASS",
    "REAL_secret_key": "SAMPLE_SECRET_KEY",
    "REAL_secret_token": "SAMPLE_SECRET_TOKEN"
}
```
Текст ключей, который совпадает с текстом в рабочем файле при синхронизации будет перезаписан на соответствующие ключам значения.

[.vscode/settings.json](.vscode/settings.json) - пример настройки для [RunOnSave](https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave) для Visual Studio Code

### Пример результата работы скрипта:

**config.json**
```json
{
    "secret_pass": "REAL_secret_pass",
    "secret_key": "REAL_secret_key",
    "secret_token": "REAL_secret_token",
    "not_secret_key": "This is not secret key"
}
```
будет преобразован в **config.sample.json**
```json
{
    "secret_pass": "SAMPLE_SECRET_PASS",
    "secret_key": "SAMPLE_SECRET_KEY",
    "secret_token": "SAMPLE_SECRET_TOKEN",
    "not_secret_key": "This is not secret key"
}
```

[.vscode/settings.json](.vscode/settings.json) - пример настройки для [RunOnSave](https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave) Visual Studio Code

```json
{
    "emeraldwalk.runonsave": {
        "commands": [
            {
                "match": "config(.*)\\.ini$",
                "cmd": "php ${workspaceFolder}/synchro.php \"${file}\""
            },
            {
                "match": "config(.*)\\.json$",
                "cmd": "python3 ${workspaceFolder}/synchro.py \"${file}\""
            }
        ]
    }
}
```
Эта конфигурация будет запускать синхронизацию при сохранении файлов соответствующих регулярному выражению `config(.*)\\.ini$`